package com.yupi.springbootinit.statemachine.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yupi.springbootinit.statemachine.entity.StateMachineConfig;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * 状态机配置数据访问层
 */
@Mapper
public interface StateMachineConfigMapper extends BaseMapper<StateMachineConfig> {
    
    /**
     * 根据实体类型获取配置列表
     * @param entityType 实体类型
     * @return 配置列表
     */
    @Select("SELECT * FROM state_machine_config WHERE entity_type = #{entityType} AND enabled = 1 AND is_delete = 0 ORDER BY config_key")
    List<StateMachineConfig> selectByEntityType(@Param("entityType") String entityType);
    
    /**
     * 根据配置键获取配置
     * @param configKey 配置键
     * @return 配置对象
     */
    @Select("SELECT * FROM state_machine_config WHERE config_key = #{configKey} AND enabled = 1 AND is_delete = 0")
    StateMachineConfig selectByConfigKey(@Param("configKey") String configKey);
    
    /**
     * 获取所有有效配置
     * @return 配置列表
     */
    @Select("SELECT * FROM state_machine_config WHERE enabled = 1 AND is_delete = 0 ORDER BY entity_type, config_key")
    List<StateMachineConfig> selectAllActive();
    
    /**
     * 批量更新配置状态
     * @param configKeys 配置键列表
     * @param enabled 是否启用
     * @param updaterId 更新人ID
     * @param updaterName 更新人姓名
     * @return 更新数量
     */
    int updateStatusBatch(@Param("configKeys") List<String> configKeys, 
                         @Param("enabled") Boolean enabled, 
                         @Param("updaterId") Long updaterId,
                         @Param("updaterName") String updaterName);
    
    /**
     * 根据实体类型和配置类型获取配置
     * @param entityType 实体类型
     * @param configType 配置类型
     * @return 配置列表
     */
    @Select("SELECT * FROM state_machine_config WHERE entity_type = #{entityType} AND config_type = #{configType} AND enabled = 1 AND is_delete = 0 ORDER BY priority DESC, config_key")
    List<StateMachineConfig> selectByEntityTypeAndConfigType(@Param("entityType") String entityType, 
                                                            @Param("configType") String configType);
}